package com.mastercard.assets.web.util.to;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblTipoCuentaPaquete;

public class PaqueteSolicitar
	implements
		Serializable
{
	private List< TblTipoCuentaPaquete > paquetes = new ArrayList< TblTipoCuentaPaquete >( ) ;
	private List< TblCuentaPaquete > paquetesAsignadosACuenta = new ArrayList< TblCuentaPaquete >( ) ;
	

	private int tipoHabitacion = 1 ;
	private TblAsset evento ;
	private int cveCuenta ;
	
	public int getCveCuenta() {
		return cveCuenta;
	}

	public void setCveCuenta(int cveCuenta) {
		this.cveCuenta = cveCuenta;
	}

	public PaqueteSolicitar( int tipoHabitacion , TblAsset evento , int cveCuenta )
	{
		this.evento = evento ;
		this.tipoHabitacion = tipoHabitacion ;
		this.cveCuenta = cveCuenta ;
	}

	public int getTipoHabitacion() {
		return tipoHabitacion;
	}

	public void setTipoHabitacion(int tipoHabitacion) {
		this.tipoHabitacion = tipoHabitacion;
	}

	public TblAsset getEvento() {
		return evento;
	}

	public void setEvento(TblAsset evento) {
		this.evento = evento;
	}
	
	public boolean verifyPackage( TblTipoCuentaPaquete paq )
	{
		// en caso de uqe este en null el evento
		if( evento == null )
			return false ;
		
		TblPaquete paquete = paq.getTblPaquete( ) ;
		
		// toma el evento
		TblAsset eventoPaq = paquete.getTblAsset( ) ;
		
		// compara ids, si no son iguales
		if( eventoPaq.getCveAsset( ) != evento.getCveAsset( ) )
			return false ;
		// si son iguales
		else
		{
			// compara el numero de habitaciones
			if( paquete.getHabitacion( ) == tipoHabitacion )
				return true ;
			else
				return false ;
		}
	}
	
	public boolean addPackageCountType( TblTipoCuentaPaquete paq )
	{
		// en caso de que si sea del mismo asset
		if( verifyPackage( paq ) )
		{
			paquetes.add( paq ) ;
			
			// toma el paquete del TblTipoCuentaPaquete
			TblPaquete paquete = paq.getTblPaquete( ) ;
			
			// toma los registros de la tabla TblCuentaPaquete
			List< TblCuentaPaquete > paquetesDeCuenta = paquete.getTblCuentaPaquetes( ) ;
			
			
			// en caso de que no sea null y no este vacio
			if( paquetesDeCuenta != null && paquetesDeCuenta.size( ) > 0 )
				// recorre para ver cuantos
				// en la estricta teoria debe ser solo uno
				for( TblCuentaPaquete paqueteDeCuenta : paquetesDeCuenta )
					// en cao de que coincida la cuenta y que no sea regresado
					if( paqueteDeCuenta.getTblCuenta( ).getCveCuenta( ) == cveCuenta && paqueteDeCuenta.getBandera( ) < 3 )
						// agrega a los paquetes
						this.paquetesAsignadosACuenta.add( paqueteDeCuenta ) ;
				
			return true ;
		}
		// en caso d eque no  coincida
		else
			return false ;
	}
	
	public int getCantidadAsignada( )
	{
		// regresa el numero de paquetes
		return paquetes.size( ) ;
	}
	
	public int getCantidadDisponible( )
	{
		int disponibles = 0 ;
		
		// recorre los paquetes
		for( TblTipoCuentaPaquete paq : paquetes )
		{
			// toma el valor a revisar
			int bandera = paq.getBandera( ) ;
			
			// en caso de que sea no asignado
			if( bandera == 1 )
				disponibles++ ;
		}
		
		// regresa resultados
		return disponibles ;
	}
	
	public int getPackageFromCount( )
	{
		// res
		int res = 0 ;
		
		// recorre los paquetes
		for( TblTipoCuentaPaquete paq : paquetes )
		{
			// paquete
			TblPaquete p = paq.getTblPaquete( ) ;
			
			if( paq.getStatus( ) == 0 || p.getStatus( ) == 0 )
				continue ;
			
			// toma la cuenta
			List< TblCuentaPaquete > cuentaPaqs = paq.getTblPaquete( ).getTblCuentaPaquetes( ) ;
			
			List< TblCuentaPaquete > cuentaPaquetes = paq.getTblPaquete( ).getTblCuentaPaquetes( ) ;
			
			// en caso d que sea 0
			if( cuentaPaquetes == null || cuentaPaquetes.size( ) == 0 )
				// sigue al siguiente
				continue ;
			// en caso de mas de 1
			else
			{
				// recorre
				for( TblCuentaPaquete cp : cuentaPaquetes )
				{
					// en caso de estar status en 0
					if( cp.getStatus( ) == 0 )
						continue ;
					else if( cp.getBandera( ) < 3 )
						res++ ;
						
				}
			}
			
//			// en caso de que tenga alguno
//			if( cuentaPaqs != null && cuentaPaqs.size( ) > 0 )
//			{
//				TblCuentaPaquete cuentaPaq = cuentaPaqs.get( 0 ) ;
//				
//				// en caso de que no sea regresado
//				if( cuentaPaq.getBandera( ) < 3 )
//				{
//					// revisa si es la misma cuenta
//					TblCuenta cuenta = cuentaPaq.getTblCuenta( ) ;
//					
//					// en caso de que coincida la cuenta 
//					if( cuenta.getCveCuenta( ) == cveCuenta )
//						res++ ;
//				}
//			}
//				
		}
		
		return res ;
	}
	
	public int getPackageToAuthorizeFromCount( )
	{
		// res
		int res = 0 ;
		
		// recorre los paquetes
		for( TblTipoCuentaPaquete paq : paquetes )
		{
			// en caso de que la bandera sea 2
			if( paq.getBandera( ) == 2 )
				res++ ;
		}
		
		return res ;
	}
	
	public List< TblTipoCuentaPaquete > getPaquetesAsignadosPorTipoCuenta( int cveCuenta )
	{
		return paquetes ;
	}
	
	public List<TblCuentaPaquete> getPaquetesAsignadosACuenta() {
		return paquetesAsignadosACuenta;
	}
}
